export default {
  id: "http://json-schema.org/draft-04/schema#",
  $schema: "http://json-schema.org/draft-04/schema#",
  description: "Core schema meta-schema",
  definitions: {
    schemaArray: {
      type: "array",
      minItems: 1,
      items: { $ref: "#" }
    },
    positiveInteger: {
      type: "integer",
      minimum: 0
    },
    positiveIntegerDefault0: {
      allOf: [{ $ref: "#/definitions/positiveInteger" }, { default: 0 }]
    },
    simpleTypes: {
      enum: [
        "array",
        "boolean",
        "integer",
        /* "null", */ // removed per https://github.com/swagger-api/swagger-editor/issues/1832#issuecomment-483717197
        "number",
        "object",
        "string"
      ]
    },
    stringArray: {
      type: "array",
      items: { type: "string" },
      minItems: 1,
      uniqueItems: true
    }
  },
  type: "object",
  properties: {
    id: {
      type: "string",
      format: "uri"
    },
    $schema: {
      type: "string",
      format: "uri"
    },
    title: {
      type: "string"
    },
    description: {
      type: "string"
    },
    default: {},
    multipleOf: {
      type: "number",
      minimum: 0,
      exclusiveMinimum: true
    },
    maximum: {
      type: "number"
    },
    exclusiveMaximum: {
      type: "boolean",
      default: false
    },
    minimum: {
      type: "number"
    },
    exclusiveMinimum: {
      type: "boolean",
      default: false
    },
    maxLength: { $ref: "#/definitions/positiveInteger" },
    minLength: { $ref: "#/definitions/positiveIntegerDefault0" },
    pattern: {
      type: "string",
      format: "regex"
    },
    additionalItems: {
      anyOf: [{ type: "boolean" }, { $ref: "#" }],
      default: {}
    },
    items: {
      anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }],
      default: {}
    },
    maxItems: { $ref: "#/definitions/positiveInteger" },
    minItems: { $ref: "#/definitions/positiveIntegerDefault0" },
    uniqueItems: {
      type: "boolean",
      default: false
    },
    maxProperties: { $ref: "#/definitions/positiveInteger" },
    minProperties: { $ref: "#/definitions/positiveIntegerDefault0" },
    required: { $ref: "#/definitions/stringArray" },
    additionalProperties: {
      anyOf: [{ type: "boolean" }, { $ref: "#" }],
      default: {}
    },
    definitions: {
      type: "object",
      additionalProperties: { $ref: "#" },
      default: {}
    },
    properties: {
      type: "object",
      additionalProperties: { $ref: "#" },
      default: {}
    },
    patternProperties: {
      type: "object",
      additionalProperties: { $ref: "#" },
      default: {}
    },
    dependencies: {
      type: "object",
      additionalProperties: {
        anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }]
      }
    },
    enum: {
      type: "array",
      minItems: 1,
      uniqueItems: true
    },
    type: {
      $ref: "#/definitions/simpleTypes"
      // anyOf: [
      //   { $ref: "#/definitions/simpleTypes" },
      //   {
      //     type: "array",
      //     items: { $ref: "#/definitions/simpleTypes" },
      //     minItems: 1,
      //     uniqueItems: true
      //   }
      // ]
    },
    allOf: { $ref: "#/definitions/schemaArray" },
    anyOf: { $ref: "#/definitions/schemaArray" },
    oneOf: { $ref: "#/definitions/schemaArray" },
    not: { $ref: "#" }
  },
  dependencies: {
    exclusiveMaximum: ["maximum"],
    exclusiveMinimum: ["minimum"]
  },
  default: {}
}
